﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EntidadesDeNegocio;
using Utiles.Observer;
using Utiles.Excepcion;

namespace ObliDisenoAplicaciones.Interfaz
{
    public partial class ABM_Diseno : Form, IObservador
    {
        private Sistema modelo;
        private TreeNode raiz;
        public delegate void CargarArbolDelegate(object obj);
        public ABM_Diseno()
        {
            InitializeComponent();
            this.FormClosing += new FormClosingEventHandler(ABM_Diseno_FormClosing);
            Sistema.Instancia.AgregarObservador(this);
            modelo = Sistema.Instancia;
            InicializarArbol();       
        }
        /// <summary>
        /// Al cerrar el formulario elimino la ventana de la lista de observers
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ABM_Diseno_FormClosing(object sender, FormClosingEventArgs e)
        {
            Sistema.Instancia.EliminarObservador(this);
        }

        private void InicializarArbol()
        {
            arbolDisenos.ImageList = arbolImagLista;
            raiz = new TreeNode();
            raiz.Text = "DISEÑOS DISPONIBLES EN EL SISTEMA";
            raiz.ContextMenuStrip = MenuNodoRaiz;
            arbolDisenos.Nodes.Add(raiz);
            CargarArbol(null);        
           
        }

        public void Actualizar(Observable obj)
        {
            // No es necesario usar el Objet obj porque la clase sistema es un sinlgeton.
            CargarArbol(obj);
            LimpiarEtiquetasDeDatos();
        }

        private void CargarArbol(object obj)
        {

            if (this.InvokeRequired)
            {
                this.Invoke(new CargarArbolDelegate(this.CargarArbol), obj);

            }
            else
            {
                raiz.Nodes.Clear();
                foreach (Diseno diseno in modelo.ListaDisenos)
                {
                    TreeNode nodoDiseno = new TreeNode();
                    nodoDiseno.Name = diseno.Nombre;
                    nodoDiseno.Text = diseno.Nombre;
                    nodoDiseno.SelectedImageIndex = 0;
                    nodoDiseno.ImageIndex = 0;
                    nodoDiseno.ContextMenuStrip = MenuNodoDiseno;
                    raiz.Nodes.Add(nodoDiseno);
                    foreach (Componente comp in diseno.ListaComponentes)
                    {
                        CargoNodoComponente(comp, nodoDiseno);
                    }

                }
                raiz.Expand();
            }
        }

        public void CargoNodoComponente(Componente comp, TreeNode padre)
        {
            TreeNode nodoComponente = new TreeNode();
            nodoComponente.Text = comp.ToString();
            nodoComponente.Name = comp.Modelo;
            nodoComponente.SelectedImageIndex = 1;
            nodoComponente.ImageIndex=1;
            if (!ExisteNodoEnPadre(nodoComponente, padre))
            {
                padre.Nodes.Add(nodoComponente);
                if (comp.GetTipo() == TipoComponente.Robot)
                {
                    nodoComponente.SelectedImageIndex = 2;
                    nodoComponente.ImageIndex = 2;
                    Robot r = (Robot)comp;
                    foreach (Componente rob in r.ListaComposicion)
                    {
                        CargoNodoComponente(rob, nodoComponente);
                    }
                }
            }     
        }

        private bool ExisteNodoEnPadre(TreeNode nodoABuscar, TreeNode padre)
        {
            bool retorno = false;
            foreach (TreeNode nodo in padre.Nodes)
            {
                if(nodo.Name.Equals(nodoABuscar.Name))
                {
                    return true;
                }
            }
            return retorno;
        }

        private void agregarDiseñoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (Stock.Instancia.ListaComponentes.Count != 0)
            {
                new AgregarModificarDiseno(null).Show();
                Sistema.Instancia.ActualizarTodo(modelo);
            }
            else
            {
                MessageBox.Show("No hay componentes creados en el Stock", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }



        private void eliminarDiseñoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            btnEliminarDiseno_Click(sender, e);
        }


        private void agregarComponenteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            new AgregarModificarDiseno(null).Show();                  
        }

        private void arbolDisenos_AfterSelect(object sender, TreeViewEventArgs e)
        {
            CargarEtiquetasDeDatos();
        }

        private void CargarEtiquetasDeDatos()
        {
            if (arbolDisenos.SelectedNode != null && !arbolDisenos.SelectedNode.Equals(raiz))
            {
                if (arbolDisenos.SelectedNode.Parent.Equals(raiz))
                {
                    //Es un diseno
                    Diseno dis = Sistema.Instancia.ObtenerDiseno(arbolDisenos.SelectedNode.Text);
                    lblSetNombre.Text = dis.Nombre;
                    lblSetMedio.Text = dis.Medio.ToString();
                    lblSetCostoAgregado.Text = dis.CostoAgregado.ToString();
                    lblSetCosto.Text = dis.Costo.ToString();                   
                    lblSetCompCosto.Text = "";
                    lblSetCompFechService.Text = "";
                    lblSetCompModelo.Text = "";
                    lblSetCompNroSerie.Text = "";
                    txtBxSetCompDescripcion.Text = "";
                    lblSetFechaCreacion.Text = "";
                    lblSetCantCompEnDiseno.Text = "";
                }
                else
                {
                    //Es un componente
                    Diseno dis = Sistema.Instancia.ObtenerDiseno(ObtenerNodoDisenoPadre(arbolDisenos.SelectedNode).Name);
                    Componente comp = dis.ObtenerComponente(arbolDisenos.SelectedNode.Name);
                    lblSetNombre.Text = dis.Nombre;
                    lblSetMedio.Text = dis.Medio.ToString();
                    lblSetCostoAgregado.Text = dis.CostoAgregado.ToString();
                    lblSetCosto.Text = dis.Costo.ToString();                    
                    lblSetCantCompEnDiseno.Text = comp.Cantidad.ToString();
                    lblSetCompCosto.Text = comp.Costo.ToString();
                    lblSetCompFechService.Text = comp.FechaService.ToShortDateString();
                    lblSetCompModelo.Text = comp.Modelo;
                    lblSetCompNroSerie.Text = comp.NumeroSerie;
                    txtBxSetCompDescripcion.Text = comp.Descripcion;
                    lblSetFechaCreacion.Text = comp.FechaCreacion.ToShortDateString();                                      
                }
            }
        }

        private void LimpiarEtiquetasDeDatos()
        {
            lblSetNombre.Text = "";
            lblSetMedio.Text = "";
            lblSetCostoAgregado.Text = "";
            lblSetCosto.Text = "";            
            lblSetCompCosto.Text = "";
            lblSetCompFechService.Text = "";
            lblSetCompModelo.Text = "";
            lblSetCompNroSerie.Text = "";
            txtBxSetCompDescripcion.Text = "";
            lblSetFechaCreacion.Text = "";
            lblSetCantCompEnDiseno.Text = "";
        }

        private TreeNode ObtenerNodoDisenoPadre(TreeNode node)
        {
            if (!node.Parent.Equals(raiz))
            {
                node = ObtenerNodoDisenoPadre(node.Parent);
            }
            return node;            
        }

        private void btnSalir_Click_1(object sender, EventArgs e)
        {
            this.Close();
        }

        private void modificarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if(arbolDisenos.SelectedNode != null)
            {
                Diseno diseno = Sistema.Instancia.ObtenerDiseno(arbolDisenos.SelectedNode.Text);
                new AgregarModificarDiseno(diseno).Show();
            }       
        }

        private void arbolDisenos_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            // Este evento es para solucionar el error de hacer click derecho sin previamente seleccionar el nodo con click izquierdo.
            if (e.Button == MouseButtons.Right)
            {
                arbolDisenos.SelectedNode = e.Node;
            }
        }

        private void btnAgregarDiseno_Click(object sender, EventArgs e)
        {
            new AgregarModificarDiseno(null).Show();
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            if (arbolDisenos.SelectedNode != null)
            {               
                Diseno diseno = Sistema.Instancia.ObtenerDiseno(arbolDisenos.SelectedNode.Text);
                if (diseno != null)
                {
                    new AgregarModificarDiseno(diseno).Show();
                }
                else {
                    MessageBox.Show("Debe seleccionar el diseño a modificar", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }      
            } 
        }

        private void btnEliminarDiseno_Click(object sender, EventArgs e)
        {
            try
            {
                if (arbolDisenos.SelectedNode != null)
                {
                    Diseno diseno = Sistema.Instancia.ObtenerDiseno(arbolDisenos.SelectedNode.Text);
                    if (diseno != null)
                    {                        
                        modelo.EliminarDiseno(diseno);
                        Sistema.Instancia.ActualizarTodo(modelo);
                    }
                    else
                    {
                        MessageBox.Show("Debe seleccionar el diseño a eliminar", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }                    
                }
            }
            catch (BDExcepcion ex)
            {
                MessageBox.Show("Error al eliminar Diseño en la base de datos - Mensaje: " + ex.Message);
            }
        }


    }
}
